home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 21
/
AMIGAplus Sonderheft 21 (1999)(ICP)(DE)[!].iso
/
PublicDomain
/
Anwendungen
/
h8jpg
/
src
/
c2p_24h8.i
next >
Wrap
Text File
|
1999-08-23
|
8KB
|
467 lines
;
;
; RGB24_to_HAM8 - Chunky2Planar converter (optimized for 68030)
;
; code by Smack/Infect
; (Sat 15-May-99)
;
; input format: RGB24 (3 bytes per pixel)
; output format: HAM8 RGBB (6 bitplanes are written)
;
; a0 - chunky input
; a1 - planar output
; a4 - bitplane size
; d7 - number of pixels to convert
;
;
c2p_24h8
move.l a1,-(a7) ;output pointer
move.l a0,-(a7) ;input pointer
addq.l #7,d7
lsr.l #3,d7 ;round up to multiple of 8
subq.l #2,d7 ;1 for prefetch and 1 for dbf
move.l d7,-(a7) ;loop counter
move.l #$0f0f0f0f,d6 ;4bit-mask
move.l #$ff00ff00,a5 ;8bit-mask
move.l #$aaaaaaaa,a6 ;1bit-mask
;pass-1- write lower two bitplanes (RGB levels 2,3)
;-------fetch + merge4
move.l (a0)+,d0 ;r1.g1,b1.r2
move.l (a0)+,d5 ;g2.b2,r3.g3
move.l (a0)+,d2 ;b3.r4,g4.b4
move.l d5,d1
move d0,d1
ror.l #8,d1 ;r2.g2,b2.b1
and.l d6,d0
and.l d6,d1
lsl.l #4,d0
or.l d1,d0
move d0,d1
lsr #8,d1
move.b d1,d0 ;r1r2.g1g2,b1b2.b1b2
move.l d2,d1
move d5,d1
rol.l #8,d1 ;r4.r3,g3.b3
and.l d6,d2
and.l d6,d1
lsl.l #4,d1
or.l d2,d1
move.b d1,d2
lsl.l #8,d1
move.b d2,d1 ;r3r4.g3g4,b3b4.b3b4
move.l (a0)+,d2 ;r5.g5,b5.r6
move.l (a0)+,d5 ;g6.b6,r7.g7
move.l (a0)+,d4 ;b7.r8,g8.b8
move.l d5,d3
move d2,d3
ror.l #8,d3 ;r6.g6,b6.b5
and.l d6,d2
and.l d6,d3
lsl.l #4,d2
or.l d3,d2
move d2,d3
lsr #8,d3
move.b d3,d2 ;r5r6.g5g6,b5b6.b5b6
move.l d4,d3
move d5,d3
rol.l #8,d3 ;r8.r7,g7.b7
and.l d6,d4
and.l d6,d3
lsl.l #4,d3
or.l d4,d3
move.b d3,d4
lsl.l #8,d3
move.b d4,d3 ;r7r8.g7g8,b7b8.b7b8
;-------merge16
move d3,d5
move d2,d4
move d1,d3
move d0,d2
swap d3
swap d2
move d3,d1
move d2,d0
move d5,d3
move d4,d2
;-------merge2
move.l #$cccccccc,d5
and.l d5,d0
and.l d5,d1
and.l d5,d2
and.l d5,d3
lsr.l #2,d2
lsr.l #2,d3
or.l d0,d2
or.l d1,d3
;-------merge8
move.l a5,d5
move.l d2,d4
lsl.l #8,d4
eor.l d3,d4
and.l d5,d4
eor.l d4,d3
lsr.l #8,d4
eor.l d4,d2
;-------merge1
move.l a6,d5
move.l d2,d4
add.l d4,d4
eor.l d3,d4
and.l d5,d4
eor.l d4,d3 ;level2
lsr.l #1,d4
move.l d3,a3 ;level2 !!!!
eor.l d2,d4 ;level3 !!!!
.loop23
;-------fetch + merge4
move.l (a0)+,d0 ;r1.g1,b1.r2
move.l (a0)+,d5 ;g2.b2,r3.g3
move.l (a0)+,d2 ;b3.r4,g4.b4
move.l d5,d1
move.l d4,(a1,a4.l) ;write level3 (delayed)
move d0,d1
ror.l #8,d1 ;r2.g2,b2.b1
and.l d6,d0
and.l d6,d1
lsl.l #4,d0
or.l d1,d0
move d0,d1
lsr #8,d1
move.b d1,d0 ;r1r2.g1g2,b1b2.b1b2
move.l d2,d1
move d5,d1
rol.l #8,d1 ;r4.r3,g3.b3
and.l d6,d2
and.l d6,d1
lsl.l #4,d1
or.l d2,d1
move.b d1,d2
lsl.l #8,d1
move.b d2,d1 ;r3r4.g3g4,b3b4.b3b4
move.l (a0)+,d2 ;r5.g5,b5.r6
move.l (a0)+,d5 ;g6.b6,r7.g7
move.l (a0)+,d4 ;b7.r8,g8.b8
move.l d5,d3
move d2,d3
ror.l #8,d3 ;r6.g6,b6.b5
and.l d6,d2
and.l d6,d3
lsl.l #4,d2
or.l d3,d2
move d2,d3
lsr #8,d3
move.b d3,d2 ;r5r6.g5g6,b5b6.b5b6
move.l d4,d3
move d5,d3
rol.l #8,d3 ;r8.r7,g7.b7
and.l d6,d4
and.l d6,d3
lsl.l #4,d3
or.l d4,d3
move.b d3,d4
lsl.l #8,d3
move.b d4,d3 ;r7r8.g7g8,b7b8.b7b8
;-------merge16
move.l a3,(a1)+ ;write level2 (delayed)
move d3,d5
move d2,d4
move d1,d3
move d0,d2
swap d3
swap d2
move d3,d1
move d2,d0
move d5,d3
move d4,d2
;-------merge2
move.l #$cccccccc,d5
and.l d5,d0
and.l d5,d1
and.l d5,d2
and.l d5,d3
lsr.l #2,d2
lsr.l #2,d3
or.l d0,d2
or.l d1,d3
;-------merge8
move.l a5,d5
move.l d2,d4
lsl.l #8,d4
eor.l d3,d4
and.l d5,d4
eor.l d4,d3
lsr.l #8,d4
eor.l d4,d2
;-------merge1
move.l a6,d5
move.l d2,d4
add.l d4,d4
eor.l d3,d4
and.l d5,d4
eor.l d4,d3 ;level2
lsr.l #1,d4
move.l d3,a3 ;level2 !!!!
eor.l d2,d4 ;level3 !!!!
dbf d7,.loop23
move.l (a7)+,d7 ;loop counter
move.l (a7)+,a0 ;input pointer
not.l d6 ;inverse 4bit-mask
;pass-2- write higher four bitplanes (RGB levels 4,5,6,7)
;-------fetch + merge4
move.l (a0)+,d0 ;r1.g1,b1.r2
move.l (a0)+,d5 ;g2.b2,r3.g3
move.l (a0)+,d2 ;b3.r4,g4.b4
move.l d5,d1
move.l d4,(a1,a4.l) ;write level3 (flush)
move d0,d1
ror.l #8,d1 ;r2.g2,b2.b1
and.l d6,d0
and.l d6,d1
lsr.l #4,d1
or.l d1,d0
move d0,d1
lsr #8,d1
move.b d1,d0 ;r1r2.g1g2,b1b2.b1b2
move.l d2,d1
move d5,d1
rol.l #8,d1 ;r4.r3,g3.b3
and.l d6,d2
and.l d6,d1
lsr.l #4,d2
or.l d2,d1
move.b d1,d2
lsl.l #8,d1
move.b d2,d1 ;r3r4.g3g4,b3b4.b3b4
move.l (a0)+,d2 ;r5.g5,b5.r6
move.l (a0)+,d5 ;g6.b6,r7.g7
move.l (a0)+,d4 ;b7.r8,g8.b8
move.l d5,d3
move d2,d3
ror.l #8,d3 ;r6.g6,b6.b5
and.l d6,d2
and.l d6,d3
lsr.l #4,d3
or.l d3,d2
move d2,d3
lsr #8,d3
move.b d3,d2 ;r5r6.g5g6,b5b6.b5b6
move.l d4,d3
move d5,d3
rol.l #8,d3 ;r8.r7,g7.b7
and.l d6,d4
and.l d6,d3
lsr.l #4,d4
or.l d4,d3
move.b d3,d4
lsl.l #8,d3
move.b d4,d3 ;r7r8.g7g8,b7b8.b7b8
;-------merge16
move.l a3,(a1) ;write level2 (flush)
move d3,d5
move d2,d4
move d1,d3
move d0,d2
swap d3
swap d2
move d3,d1
move d2,d0
move d5,d3
move d4,d2
;-------merge2
move.l #$cccccccc,d5
move.l d0,d4
lsl.l #2,d4
eor.l d2,d4
and.l d5,d4
eor.l d4,d2
lsr.l #2,d4
eor.l d4,d0
move.l d1,d4
lsl.l #2,d4
eor.l d3,d4
and.l d5,d4
eor.l d4,d3
lsr.l #2,d4
eor.l d4,d1
;-------merge8
move.l (a7)+,a1 ;output pointer
move.l a5,d5
move.l d0,d4
lea (a1,a4.l*2),a1
lsl.l #8,d4
eor.l d1,d4
and.l d5,d4
eor.l d4,d1
lsr.l #8,d4
eor.l d4,d0
move.l d2,d4
lsl.l #8,d4
eor.l d3,d4
and.l d5,d4
eor.l d4,d3
lsr.l #8,d4
eor.l d4,d2
;-------merge1
move.l a6,d5
move.l d0,d4
add.l d4,d4
eor.l d1,d4
and.l d5,d4
eor.l d4,d1 ;level6
move.l d1,(a1,a4.l*2) ;write level6 (immediately)
lsr.l #1,d4
eor.l d4,d0 ;level7
move.l d2,d4
move.l d0,a2 ;level7 !!!!
add.l d4,d4
eor.l d3,d4
and.l d5,d4
eor.l d4,d3 ;level4
lsr.l #1,d4
move.l d3,a3 ;level4 !!!!
eor.l d2,d4 ;level5 !!!!
.loop4567
;-------fetch + merge4
move.l (a0)+,d0 ;r1.g1,b1.r2
move.l (a0)+,d5 ;g2.b2,r3.g3
move.l (a0)+,d2 ;b3.r4,g4.b4
add.l a4,a1 ;level up
move.l d5,d1
move.l d4,(a1) ;write level5 (delayed)
move d0,d1
ror.l #8,d1 ;r2.g2,b2.b1
and.l d6,d0
and.l d6,d1
lsr.l #4,d1
or.l d1,d0
move d0,d1
lsr #8,d1
move.b d1,d0 ;r1r2.g1g2,b1b2.b1b2
move.l d2,d1
move d5,d1
rol.l #8,d1 ;r4.r3,g3.b3
and.l d6,d2
and.l d6,d1
lsr.l #4,d2
or.l d2,d1
move.b d1,d2
lsl.l #8,d1
move.b d2,d1 ;r3r4.g3g4,b3b4.b3b4
move.l (a0)+,d2 ;r5.g5,b5.r6
move.l (a0)+,d5 ;g6.b6,r7.g7
move.l (a0)+,d4 ;b7.r8,g8.b8
move.l d5,d3
move.l a2,(a1,a4.l*2) ;write level7 (delayed)
move d2,d3
ror.l #8,d3 ;r6.g6,b6.b5
and.l d6,d2
and.l d6,d3
lsr.l #4,d3
or.l d3,d2
move d2,d3
lsr #8,d3
move.b d3,d2 ;r5r6.g5g6,b5b6.b5b6
move.l d4,d3
move d5,d3
rol.l #8,d3 ;r8.r7,g7.b7
and.l d6,d4
and.l d6,d3
lsr.l #4,d4
or.l d4,d3
move.b d3,d4
lsl.l #8,d3
move.b d4,d3 ;r7r8.g7g8,b7b8.b7b8
;-------merge16
move d3,d5
move d2,d4
move d1,d3
move d0,d2
swap d3
swap d2
move d3,d1
move d2,d0
move d5,d3
move d4,d2
;-------merge2
sub.l a4,a1 ;level down
move.l #$cccccccc,d5
move.l d0,d4
move.l a3,(a1)+ ;write level4 (delayed)
lsl.l #2,d4
eor.l d2,d4
and.l d5,d4
eor.l d4,d2
lsr.l #2,d4
eor.l d4,d0
move.l d1,d4
lsl.l #2,d4
eor.l d3,d4
and.l d5,d4
eor.l d4,d3
lsr.l #2,d4
eor.l d4,d1
;-------merge8
move.l a5,d5
move.l d0,d4
lsl.l #8,d4
eor.l d1,d4
and.l d5,d4
eor.l d4,d1
lsr.l #8,d4
eor.l d4,d0
move.l d2,d4
lsl.l #8,d4
eor.l d3,d4
and.l d5,d4
eor.l d4,d3
lsr.l #8,d4
eor.l d4,d2
;-------merge1
move.l a6,d5
move.l d0,d4
add.l d4,d4
eor.l d1,d4
and.l d5,d4
eor.l d4,d1 ;level6
move.l d1,(a1,a4.l*2) ;write level6 (immediately)
lsr.l #1,d4
eor.l d4,d0 ;level7
move.l d2,d4
move.l d0,a2 ;level7 !!!!
add.l d4,d4
eor.l d3,d4
and.l d5,d4
eor.l d4,d3 ;level4
lsr.l #1,d4
move.l d3,a3 ;level4 !!!!
eor.l d2,d4 ;level5 !!!!
dbf d7,.loop4567
move.l a3,(a1) ;write level4 (flush)
add.l a4,a1
move.l d4,(a1) ;write level5 (flush)
move.l a2,(a1,a4.l*2) ;write level7 (flush)
rts